// 为了便于维护 这个超级大项目 路由守卫抽离出来
import router, { asyncRoutes } from './router'
import store from './store'
// import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'


NProgress.configure({ showSpinner: false }) // NProgress Configuration

const whiteList = ['/login', '/404'] // no redirect whitelist

// 应该是进入页面之前 就获取到用户信息 然后再进来 => 路由前置守卫调用action 得等到数据回来在 next()
router.beforeEach(async(to, from, next) => {
  // start progress bar
 

  // set page title
  document.title = getPageTitle(to.meta.title)

  // determine whether the user has logged in
  const hasToken = getToken()
if(hasToken){
  if(to.path === '/login'){
    next( '/' )
    NProgress.done() // 这里需要手动关闭进度条 没有放行 到不了后置守卫
  }else{
    // 应该这里发请求 调用action => 数据拿到了 放行 => 保证进入之前 获取到了用户信息
    //第一次获取用户信息后 就不需要发了 => 如果没有用户信息 发请求 有就不发
    if(!store.getters.userId){
          // if(!store.state.user.userInfo.userId)
    const res = await store.dispatch('user/getuserInfo')
     //  这里是最早拿到用户信息的 根据这的用户信息menus 去锅炉asynRoutes 得到用户专属路有规则 再放行
      // console.log('用户权限', res.roles.menus)
          // 过滤的标准: 我建议不用path => 用name => 我们自己加的需要和后端返回的权限严格统一
        const userRoutes =  asyncRoutes.filter(item =>{
      if(res.roles.menus.includes(item.name)){
           return true
         }else{
            return false
         }
      })

      // 调用user模块的mutation 更新routes
      store.commit('user/setROutes',userRoutes)

              //  console.log(userRoutes, '用户专属路由规则')  // 和当前用户没有关系
           // 需要将userRoutes添加到当前用户的路由规则中, 路由实例.addRoutes(规则数组) 专用于实例化后 又想加规则
             router.addRoutes([
                ...userRoutes, // 添加用户专属路由规则
                    { path: '*', redirect: '/404', hidden: true }   // 这样才能保证在最后
               ])
             next(to.path)  // 重进 目的是让路由拥有信息
                 return
            // 坑1. *规则必须放在最后
             // 坑2. addRooutes加完路由规则不会立即生效(作者历史遗留问题) => next(to.path) 重进一下当前页面 让规则生效
    }
    next()
  }
}else{
  if(whiteList.includes(to.path)){
    next()
  }else{
    next('/login')
    NProgress.done() // 这里需要手动关闭进度条 没有放行 到不了后置守卫
  }
}
NProgress.start()
})

router.afterEach(() => {
  // finish progress bar
  NProgress.done()
  // 它只有前置守卫放行时,才会进入后置守卫, 
})
